// Copyright 2006 Google Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//   http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
document.createElement("canvas").getContext || (function() {
	var s = Math,j = s.round,F = s.sin,G = s.cos,V = s.abs,W = s.sqrt,k = 10,v = k / 2;

	function X() {
		return this.context_ || (this.context_ = new H(this))
	}

	var L = Array.prototype.slice;

	function Y(b, a) {
		var c = L.call(arguments, 2);
		return function() {
			return b.apply(a, c.concat(L.call(arguments)))
		}
	}

	var M = {init:function(b) {
		if (/MSIE/.test(navigator.userAgent) && !window.opera) {
			var a = b || document;
			a.createElement("canvas");
			a.attachEvent("onreadystatechange", Y(this.init_, this, a))
		}
	},init_:function(b) {
		b.namespaces.g_vml_ ||
		b.namespaces.add("g_vml_", "urn:schemas-microsoft-com:vml", "#default#VML");
		b.namespaces.g_o_ || b.namespaces.add("g_o_", "urn:schemas-microsoft-com:office:office", "#default#VML");
		if (!b.styleSheets.ex_canvas_) {
			var a = b.createStyleSheet();
			a.owningElement.id = "ex_canvas_";
			a.cssText = "canvas{display:inline-block;overflow:hidden;text-align:left;width:300px;height:150px}g_vml_\\:*{behavior:url(#default#VML)}g_o_\\:*{behavior:url(#default#VML)}"
		}
		var c = b.getElementsByTagName("canvas"),d = 0;
		for (; d < c.length; d++)this.initElement(c[d])
	},
		initElement:function(b) {
			if (!b.getContext) {
				b.getContext = X;
				b.innerHTML = "";
				b.attachEvent("onpropertychange", Z);
				b.attachEvent("onresize", $);
				var a = b.attributes;
				if (a.width && a.width.specified)b.style.width = a.width.nodeValue + "px"; else b.width = b.clientWidth;
				if (a.height && a.height.specified)b.style.height = a.height.nodeValue + "px"; else b.height = b.clientHeight
			}
			return b
		}};

	function Z(b) {
		var a = b.srcElement;
		switch (b.propertyName) {
			case "width":
				a.style.width = a.attributes.width.nodeValue + "px";
				a.getContext().clearRect();
				break;
			case "height":
				a.style.height = a.attributes.height.nodeValue + "px";
				a.getContext().clearRect();
				break
		}
	}

	function $(b) {
		var a = b.srcElement;
		if (a.firstChild) {
			a.firstChild.style.width = a.clientWidth + "px";
			a.firstChild.style.height = a.clientHeight + "px"
		}
	}

	M.init();
	var N = [],B = 0;
	for (; B < 16; B++) {
		var C = 0;
		for (; C < 16; C++)N[B * 16 + C] = B.toString(16) + C.toString(16)
	}
	function I() {
		return[
			[1,0,0],
			[0,1,0],
			[0,0,1]
		]
	}

	function y(b, a) {
		var c = I(),d = 0;
		for (; d < 3; d++) {
			var f = 0;
			for (; f < 3; f++) {
				var h = 0,g = 0;
				for (; g < 3; g++)h += b[d][g] * a[g][f];
				c[d][f] =
				h
			}
		}
		return c
	}

	function O(b, a) {
		a.fillStyle = b.fillStyle;
		a.lineCap = b.lineCap;
		a.lineJoin = b.lineJoin;
		a.lineWidth = b.lineWidth;
		a.miterLimit = b.miterLimit;
		a.shadowBlur = b.shadowBlur;
		a.shadowColor = b.shadowColor;
		a.shadowOffsetX = b.shadowOffsetX;
		a.shadowOffsetY = b.shadowOffsetY;
		a.strokeStyle = b.strokeStyle;
		a.globalAlpha = b.globalAlpha;
		a.arcScaleX_ = b.arcScaleX_;
		a.arcScaleY_ = b.arcScaleY_;
		a.lineScale_ = b.lineScale_
	}

	function P(b) {
		var a,c = 1;
		b = String(b);
		if (b.substring(0, 3) == "rgb") {
			var d = b.indexOf("(", 3),f = b.indexOf(")", d +
														 1),h = b.substring(d + 1, f).split(",");
			a = "#";
			var g = 0;
			for (; g < 3; g++)a += N[Number(h[g])];
			if (h.length == 4 && b.substr(3, 1) == "a")c = h[3]
		} else a = b;
		return{color:a,alpha:c}
	}

	function aa(b) {
		switch (b) {
			case "butt":
				return"flat";
			case "round":
				return"round";
			case "square":
			default:
				return"square"
		}
	}

	function H(b) {
		this.m_ = I();
		this.mStack_ = [];
		this.aStack_ = [];
		this.currentPath_ = [];
		this.fillStyle = this.strokeStyle = "#000";
		this.lineWidth = 1;
		this.lineJoin = "miter";
		this.lineCap = "butt";
		this.miterLimit = k * 1;
		this.globalAlpha = 1;
		this.canvas = b;
		var a = b.ownerDocument.createElement("div");
		a.style.width = b.clientWidth + "px";
		a.style.height = b.clientHeight + "px";
		a.style.overflow = "hidden";
		a.style.position = "absolute";
		b.appendChild(a);
		this.element_ = a;
		this.lineScale_ = this.arcScaleY_ = this.arcScaleX_ = 1
	}

	var i = H.prototype;
	i.clearRect = function() {
		this.element_.innerHTML = ""
	};
	i.beginPath = function() {
		this.currentPath_ = []
	};
	i.moveTo = function(b, a) {
		var c = this.getCoords_(b, a);
		this.currentPath_.push({type:"moveTo",x:c.x,y:c.y});
		this.currentX_ = c.x;
		this.currentY_ = c.y
	};
	i.lineTo = function(b, a) {
		var c = this.getCoords_(b, a);
		this.currentPath_.push({type:"lineTo",x:c.x,y:c.y});
		this.currentX_ = c.x;
		this.currentY_ = c.y
	};
	i.bezierCurveTo = function(b, a, c, d, f, h) {
		var g = this.getCoords_(f, h),l = this.getCoords_(b, a),e = this.getCoords_(c, d);
		Q(this, l, e, g)
	};
	function Q(b, a, c, d) {
		b.currentPath_.push({type:"bezierCurveTo",cp1x:a.x,cp1y:a.y,cp2x:c.x,cp2y:c.y,x:d.x,y:d.y});
		b.currentX_ = d.x;
		b.currentY_ = d.y
	}

	i.quadraticCurveTo = function(b, a, c, d) {
		var f = this.getCoords_(b, a),h = this.getCoords_(c, d),g = {x:this.currentX_ +
																	   0.6666666666666666 * (f.x - this.currentX_),y:this.currentY_ + 0.6666666666666666 * (f.y - this.currentY_)};
		Q(this, g, {x:g.x + (h.x - this.currentX_) / 3,y:g.y + (h.y - this.currentY_) / 3}, h)
	};
	i.arc = function(b, a, c, d, f, h) {
		c *= k;
		var g = h ? "at" : "wa",l = b + G(d) * c - v,e = a + F(d) * c - v,m = b + G(f) * c - v,r = a + F(f) * c - v;
		if (l == m && !h)l += 0.125;
		var n = this.getCoords_(b, a),o = this.getCoords_(l, e),q = this.getCoords_(m, r);
		this.currentPath_.push({type:g,x:n.x,y:n.y,radius:c,xStart:o.x,yStart:o.y,xEnd:q.x,yEnd:q.y})
	};
	i.rect = function(b, a, c, d) {
		this.moveTo(b,
					a);
		this.lineTo(b + c, a);
		this.lineTo(b + c, a + d);
		this.lineTo(b, a + d);
		this.closePath()
	};
	i.strokeRect = function(b, a, c, d) {
		var f = this.currentPath_;
		this.beginPath();
		this.moveTo(b, a);
		this.lineTo(b + c, a);
		this.lineTo(b + c, a + d);
		this.lineTo(b, a + d);
		this.closePath();
		this.stroke();
		this.currentPath_ = f
	};
	i.fillRect = function(b, a, c, d) {
		var f = this.currentPath_;
		this.beginPath();
		this.moveTo(b, a);
		this.lineTo(b + c, a);
		this.lineTo(b + c, a + d);
		this.lineTo(b, a + d);
		this.closePath();
		this.fill();
		this.currentPath_ = f
	};
	i.createLinearGradient = function(b, a, c, d) {
		var f = new D("gradient");
		f.x0_ = b;
		f.y0_ = a;
		f.x1_ = c;
		f.y1_ = d;
		return f
	};
	i.createRadialGradient = function(b, a, c, d, f, h) {
		var g = new D("gradientradial");
		g.x0_ = b;
		g.y0_ = a;
		g.r0_ = c;
		g.x1_ = d;
		g.y1_ = f;
		g.r1_ = h;
		return g
	};
	i.drawImage = function(b) {
		var a,c,d,f,h,g,l,e,m = b.runtimeStyle.width,r = b.runtimeStyle.height;
		b.runtimeStyle.width = "auto";
		b.runtimeStyle.height = "auto";
		var n = b.width,o = b.height;
		b.runtimeStyle.width = m;
		b.runtimeStyle.height = r;
		if (arguments.length == 3) {
			a = arguments[1];
			c = arguments[2];
			h = g = 0;
			l = d = n;
			e = f = o
		} else if (arguments.length ==
				   5) {
			a = arguments[1];
			c = arguments[2];
			d = arguments[3];
			f = arguments[4];
			h = g = 0;
			l = n;
			e = o
		} else if (arguments.length == 9) {
			h = arguments[1];
			g = arguments[2];
			l = arguments[3];
			e = arguments[4];
			a = arguments[5];
			c = arguments[6];
			d = arguments[7];
			f = arguments[8]
		} else throw Error("Invalid number of arguments");
		var q = this.getCoords_(a, c),t = [];
		t.push(" <g_vml_:group", ' coordsize="', k * 10, ",", k * 10, '"', ' coordorigin="0,0"', ' style="width:', 10, "px;height:", 10, "px;position:absolute;");
		if (this.m_[0][0] != 1 || this.m_[0][1]) {
			var E = [];
			E.push("M11=",
				   this.m_[0][0], ",", "M12=", this.m_[1][0], ",", "M21=", this.m_[0][1], ",", "M22=", this.m_[1][1], ",", "Dx=", j(q.x / k), ",", "Dy=", j(q.y / k), "");
			var p = q,z = this.getCoords_(a + d, c),w = this.getCoords_(a, c + f),x = this.getCoords_(a + d, c + f);
			p.x = s.max(p.x, z.x, w.x, x.x);
			p.y = s.max(p.y, z.y, w.y, x.y);
			t.push("padding:0 ", j(p.x / k), "px ", j(p.y / k), "px 0;filter:progid:DXImageTransform.Microsoft.Matrix(", E.join(""), ", sizingmethod='clip');")
		} else t.push("top:", j(q.y / k), "px;left:", j(q.x / k), "px;");
		t.push(' ">', '<g_vml_:image src="', b.src,
			   '"', ' style="width:', k * d, "px;", " height:", k * f, 'px;"', ' cropleft="', h / n, '"', ' croptop="', g / o, '"', ' cropright="', (n - h - l) / n, '"', ' cropbottom="', (o - g - e) / o, '"', " />", "</g_vml_:group>");
		this.element_.insertAdjacentHTML("BeforeEnd", t.join(""))
	};
	i.stroke = function(b) {
		var a = [],c = P(b ? this.fillStyle : this.strokeStyle),d = c.color,f = c.alpha * this.globalAlpha;
		a.push("<g_vml_:shape", ' filled="', !!b, '"', ' style="position:absolute;width:', 10, "px;height:", 10, 'px;"', ' coordorigin="0 0" coordsize="', k * 10, " ", k * 10, '"', ' stroked="',
			   !b, '"', ' path="');
		var h = {x:null,y:null},g = {x:null,y:null},l = 0;
		for (; l < this.currentPath_.length; l++) {
			var e = this.currentPath_[l];
			switch (e.type) {
				case "moveTo":
					a.push(" m ", j(e.x), ",", j(e.y));
					break;
				case "lineTo":
					a.push(" l ", j(e.x), ",", j(e.y));
					break;
				case "close":
					a.push(" x ");
					e = null;
					break;
				case "bezierCurveTo":
					a.push(" c ", j(e.cp1x), ",", j(e.cp1y), ",", j(e.cp2x), ",", j(e.cp2y), ",", j(e.x), ",", j(e.y));
					break;
				case "at":
				case "wa":
					a.push(" ", e.type, " ", j(e.x - this.arcScaleX_ * e.radius), ",", j(e.y - this.arcScaleY_ * e.radius),
						   " ", j(e.x + this.arcScaleX_ * e.radius), ",", j(e.y + this.arcScaleY_ * e.radius), " ", j(e.xStart), ",", j(e.yStart), " ", j(e.xEnd), ",", j(e.yEnd));
					break
			}
			if (e) {
				if (h.x == null || e.x < h.x)h.x = e.x;
				if (g.x == null || e.x > g.x)g.x = e.x;
				if (h.y == null || e.y < h.y)h.y = e.y;
				if (g.y == null || e.y > g.y)g.y = e.y
			}
		}
		a.push(' ">');
		if (b)if (typeof this.fillStyle == "object") {
			var m = this.fillStyle,r = 0,n = {x:0,y:0},o = 0,q = 1;
			if (m.type_ == "gradient") {
				var t = m.x1_ / this.arcScaleX_,E = m.y1_ / this.arcScaleY_,p = this.getCoords_(m.x0_ / this.arcScaleX_, m.y0_ / this.arcScaleY_),
						z = this.getCoords_(t, E);
				r = Math.atan2(z.x - p.x, z.y - p.y) * 180 / Math.PI;
				if (r < 0)r += 360;
				if (r < 1.0E-6)r = 0
			} else {
				var p = this.getCoords_(m.x0_, m.y0_),w = g.x - h.x,x = g.y - h.y;
				n = {x:(p.x - h.x) / w,y:(p.y - h.y) / x};
				w /= this.arcScaleX_ * k;
				x /= this.arcScaleY_ * k;
				var R = s.max(w, x);
				o = 2 * m.r0_ / R;
				q = 2 * m.r1_ / R - o
			}
			var u = m.colors_;
			u.sort(function(ba, ca) {
				return ba.offset - ca.offset
			});
			var J = u.length,da = u[0].color,ea = u[J - 1].color,fa = u[0].alpha * this.globalAlpha,ga = u[J - 1].alpha * this.globalAlpha,S = [],l = 0;
			for (; l < J; l++) {
				var T = u[l];
				S.push(T.offset * q +
					   o + " " + T.color)
			}
			a.push('<g_vml_:fill type="', m.type_, '"', ' method="none" focus="100%"', ' color="', da, '"', ' color2="', ea, '"', ' colors="', S.join(","), '"', ' opacity="', ga, '"', ' g_o_:opacity2="', fa, '"', ' angle="', r, '"', ' focusposition="', n.x, ",", n.y, '" />')
		} else a.push('<g_vml_:fill color="', d, '" opacity="', f, '" />'); else {
			var K = this.lineScale_ * this.lineWidth;
			if (K < 1)f *= K;
			a.push("<g_vml_:stroke", ' opacity="', f, '"', ' joinstyle="', this.lineJoin, '"', ' miterlimit="', this.miterLimit, '"', ' endcap="', aa(this.lineCap),
				   '"', ' weight="', K, 'px"', ' color="', d, '" />')
		}
		a.push("</g_vml_:shape>");
		this.element_.insertAdjacentHTML("beforeEnd", a.join(""))
	};
	i.fill = function() {
		this.stroke(true)
	};
	i.closePath = function() {
		this.currentPath_.push({type:"close"})
	};
	i.getCoords_ = function(b, a) {
		var c = this.m_;
		return{x:k * (b * c[0][0] + a * c[1][0] + c[2][0]) - v,y:k * (b * c[0][1] + a * c[1][1] + c[2][1]) - v}
	};
	i.save = function() {
		var b = {};
		O(this, b);
		this.aStack_.push(b);
		this.mStack_.push(this.m_);
		this.m_ = y(I(), this.m_)
	};
	i.restore = function() {
		O(this.aStack_.pop(),
		  this);
		this.m_ = this.mStack_.pop()
	};
	function ha(b) {
		var a = 0;
		for (; a < 3; a++) {
			var c = 0;
			for (; c < 2; c++)if (!isFinite(b[a][c]) || isNaN(b[a][c]))return false
		}
		return true
	}

	function A(b, a, c) {
		if (!!ha(a)) {
			b.m_ = a;
			if (c)b.lineScale_ = W(V(a[0][0] * a[1][1] - a[0][1] * a[1][0]))
		}
	}

	i.translate = function(b, a) {
		A(this, y([
					  [1,0,0],
					  [0,1,0],
					  [b,a,1]
				  ], this.m_), false)
	};
	i.rotate = function(b) {
		var a = G(b),c = F(b);
		A(this, y([
					  [a,c,0],
					  [-c,a,0],
					  [0,0,1]
				  ], this.m_), false)
	};
	i.scale = function(b, a) {
		this.arcScaleX_ *= b;
		this.arcScaleY_ *= a;
		A(this, y([
					  [b,0,0],
					  [0,a,
					   0],
					  [0,0,1]
				  ], this.m_), true)
	};
	i.transform = function(b, a, c, d, f, h) {
		A(this, y([
					  [b,a,0],
					  [c,d,0],
					  [f,h,1]
				  ], this.m_), true)
	};
	i.setTransform = function(b, a, c, d, f, h) {
		A(this, [
			[b,a,0],
			[c,d,0],
			[f,h,1]
		], true)
	};
	i.clip = function() {
	};
	i.arcTo = function() {
	};
	i.createPattern = function() {
		return new U
	};
	function D(b) {
		this.type_ = b;
		this.r1_ = this.y1_ = this.x1_ = this.r0_ = this.y0_ = this.x0_ = 0;
		this.colors_ = []
	}

	D.prototype.addColorStop = function(b, a) {
		a = P(a);
		this.colors_.push({offset:b,color:a.color,alpha:a.alpha})
	};
	function U() {
	}

	G_vmlCanvasManager =
	M;
	CanvasRenderingContext2D = H;
	CanvasGradient = D;
	CanvasPattern = U
})();
